<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems API documentation</title>
<meta name="description" content="" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/ir-black.min.css" crossorigin>
<style>
:root {
--highlight-color: #202;
}
html {
scrollbar-face-color: #646464;
scrollbar-base-color: #646464;
scrollbar-3dlight-color: #646464;
scrollbar-highlight-color: #646464;
scrollbar-track-color: #000;
scrollbar-arrow-color: #000;
scrollbar-shadow-color: #646464;
scrollbar-dark-shadow-color: #646464;
}
::-webkit-scrollbar { width: 14px; height: 3px;}
::-webkit-scrollbar-button {
background-color: #000;
height: 3px;}
::-webkit-scrollbar-track {
background-color: #646464;}
::-webkit-scrollbar-track-piece { background-color: #000;}
::-webkit-scrollbar-thumb { height: 50px; background-color: #666; border-radius: 7px;}
::-webkit-scrollbar-corner { background-color: #646464;}
::-webkit-resizer { background-color: #666;}
.flex {
display: flex !important;
}
body {
line-height: 1.5em;
color: #fff;
background-color: #1e1e1e;
font: 14px/1.5 Helvetica, Arial, sans-serif;
margin: 0;
padding: 0;
}
#content {
padding: 20px;
}
#sidebar {
padding: 30px;
overflow: hidden;
}
#sidebar>*:last-child {
margin-bottom: 2cm;
}
.http-server-breadcrumbs {
font-size: 130%;
margin: 0 0 15px 0;
}
#footer {
font-size: .75em;
padding: 5px 30px;
border-top: 1px solid #fff;
text-align: right;
}
#footer p {
margin: 0 0 0 1em;
display: inline-block;
}
#footer p:last-child {
margin-right: 30px;
}
h1,
h2,
h3,
h4,
h5 {
font-weight: 300;
color: #fff;
}
h1 {
font-size: 2.5em;
line-height: 1.1em;
}
h2 {
font-size: 1.75em;
margin: 1em 0 .50em 0;
}
h3 {
font-size: 1.4em;
margin: 25px 0 10px 0;
}
h4 {
margin: 0;
font-size: 105%;
}
h1:target,
h2:target,
h3:target,
h4:target,
h5:target,
h6:target {
background: #1e1e1e;
padding: 0.2em 0;
}
a {
color: #8fd6fc;
text-decoration: none;
transition: color .3s ease-in-out;
}
a:hover {
color: #00a4fc;
}
.title code {
font-weight: bold;
}
h2[id^="header-"] {
margin-top: 2em;
}
.ident {
color: #f6fc85;
}
strong {
color: #8fd6fc;
}
pre code {
background: transparent;
font-size: .8em;
line-height: 1.4em;
}
code {
background: rgba(255, 255, 255, 0.1);
padding: 1px 4px;
overflow-wrap: break-word;
}
h1 code {
background: transparent
}
pre {
background: transparent;
border: 0;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
margin: 1em 0;
padding: 1ex;
}
#http-server-module-list {
display: flex;
flex-flow: column;
}
#http-server-module-list div {
display: flex;
}
#http-server-module-list dt {
min-width: 10%;
}
#http-server-module-list p {
margin-top: 0;
}
.toc ul,
#index {
list-style-type: none;
margin: 0;
padding: 0;
}
#index code {
background: transparent;
}
#index h3 {
border-bottom: 1px solid #ddd;
}
#index ul {
padding: 0;
}
#index h4 {
margin-top: .6em;
font-weight: bold;
}
/* Make TOC lists have 2+ columns when viewport is wide enough.
Assuming ~20-character identifiers and ~30% wide sidebar. */
@media (min-width: 200ex) {
#index .two-column {
column-count: 2
}
}
@media (min-width: 300ex) {
#index .two-column {
column-count: 3
}
}
dl {
margin-bottom: 2em;
}
dl dl:last-child {
margin-bottom: 4em;
}
dd {
margin: 0 0 1em 3em;
}
#header-classes+dl>dd {
margin-bottom: 3em;
}
dd dd {
margin-left: 2em;
}
dd p {
margin: 10px 0;
}
.name {
background: #000;
font-weight: bold;
font-size: .85em;
padding: 5px 10px;
display: inline-block;
min-width: 40%;
}
.name:hover {
background: #0b0b0b;
}
dt:target .name {
background: var(--highlight-color);
}
.name>span:first-child {
white-space: nowrap;
}
.name.class>span:nth-child(2) {
margin-left: .4em;
}
.inherited {
color: #999;
border-left: 5px solid #eee;
padding-left: 1em;
}
.inheritance em {
font-style: normal;
font-weight: bold;
}
.pydefname {
color: #f90;
}
/* Docstrings titles, e.g. in numpydoc format */
.desc h2 {
font-weight: 400;
font-size: 1.25em;
}
.desc h3 {
font-size: 1em;
}
.desc dt code {
background: inherit;
/* Don't grey-back parameters */
}
.source summary,
.git-link-div {
color: #666;
text-align: right;
font-weight: 400;
font-size: .8em;
text-transform: uppercase;
}
.source summary>* {
white-space: nowrap;
cursor: pointer;
}
.git-link {
color: inherit;
margin-left: 1em;
}
.source pre {
max-height: 500px;
overflow: auto;
margin: 0;
}
.source pre code {
font-size: 12px;
overflow: visible;
}
.hlist {
list-style: none;
}
.hlist li {
display: inline;
}
.hlist li:after {
content: ',\2002';
}
.hlist li:last-child:after {
content: none;
}
.hlist .hlist {
display: inline;
padding-left: 1em;
}
img {
max-width: 100%;
}
td {
padding: 0 .5em;
}
.admonition {
padding: .1em .5em;
margin-bottom: 1em;
}
.admonition-title {
font-weight: bold;
}
.admonition.note,
.admonition.info,
.admonition.important {
background: #00a;
}
.admonition.todo,
.admonition.versionadded,
.admonition.tip,
.admonition.hint {
background: #050;
}
.admonition.warning,
.admonition.versionchanged,
.admonition.deprecated {
background: #ec0;
}
.admonition.error,
.admonition.danger,
.admonition.caution {
background: #c20010;
}
p {
color: #fff;
}
</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">import json
from src.logger import print
from src.variables import *
from src.settings import *
from src.helpers import *
from src.mainUI import *
import sys
import plugins.Map.GameData.nodes as nodes
import math
import plugins.Map.GameData.prefabs as prefabs
import plugins.Map.GameData.roads as roads
import src.mainUI as mainUI
import math
class PrefabItem:
    Uid = 0
    StartNodeUid = 0
    EndNodeUid = 0
    StartNode = None
    Nodes = []
    BlockSize = 0
    Valid = False
    Type = 0
    X = 0
    Z = 0
    Hidden = False
    Flags = 0
    Navigation = []
    Origin = 0
    Padding = 0
    Prefab = None
    NavigationLanes = []
    IsSecret = False
    CurvePoints = [[]]
    EndPoints = []
    
class NavigationItem2:
    Uid = 0
    Type = &#34;&#34;
    
class Navigation:
    NavId = 0
    Item1 = 0
    Item2 = []
    

prefabItems = []
optimizedPrefabItems = {}

prefabItemsFileName = variables.PATH + &#34;/plugins/Map/GameData/prefab_items.json&#34;

itemsMinX = 0
itemsMaxX = 0
itemsMinZ = 0
itemsMaxZ = 0
itemsTotalWidth = 0
itemsTotalHeight = 0
itemsAreaCountX = 0
itemsAreaCountZ = 0

def LoadPrefabItems():
    global prefabItems
    global optimizedPrefabItems
    global itemsMinX
    global itemsMaxX
    global itemsMinZ
    global itemsMaxZ
    global itemsTotalWidth
    global itemsTotalHeight
    global itemsAreaCountX
    global itemsAreaCountZ
    
    jsonData = json.load(open(prefabItemsFileName))
    jsonLength = len(jsonData)
    
    count = 0
    for item in jsonData:
        item = jsonData[item]
        
        itemObj = PrefabItem()
        itemObj.Uid = item[&#34;Uid&#34;]
        itemObj.StartNodeUid = item[&#34;StartNodeUid&#34;]
        itemObj.EndNodeUid = item[&#34;EndNodeUid&#34;]
        
        itemObj.Nodes = []
        for node in item[&#34;Nodes&#34;]:
            itemObj.Nodes.append(nodes.GetNodeByUid(node))
        
        itemObj.BlockSize = item[&#34;BlockSize&#34;]
        itemObj.Valid = item[&#34;Valid&#34;]
        itemObj.Type = item[&#34;Type&#34;]
        itemObj.X = item[&#34;X&#34;]
        itemObj.Z = item[&#34;Z&#34;]
        itemObj.Hidden = item[&#34;Hidden&#34;]
        itemObj.Flags = item[&#34;Flags&#34;]
        
        itemObj.Navigation = []
        for nav in item[&#34;Navigation&#34;]:
            navObj = Navigation()
            navId = nav
            nav = item[&#34;Navigation&#34;][nav]
            navObj.NavId = navId
            navObj.Item1 = nav[&#34;Item1&#34;]
            navObj.Item2 = []
            for item2 in nav[&#34;Item2&#34;]:
                item2Obj = NavigationItem2()
                item2Obj.Uid = item2[&#34;Uid&#34;]
                item2Obj.Type = item2[&#34;Type&#34;]
                navObj.Item2.append(item2Obj)
                
            itemObj.Navigation.append(navObj)
            navObj = None
            
        itemObj.Origin = item[&#34;Origin&#34;]
        itemObj.Padding = item[&#34;Padding&#34;]
        itemObj.Prefab = item[&#34;Prefab&#34;]
        itemObj.IsSecret = item[&#34;IsSecret&#34;]
        itemObj.CurvePoints = item[&#34;curvePoints&#34;]
        
        if itemObj.Valid:
            prefabItems.append(itemObj)
        
        count += 1
        
        if count % int(jsonLength/100) == 0:
            sys.stdout.write(f&#34;\rLoaded {count} prefab items.\r&#34;)
            data = {
                &#34;state&#34;: f&#34;Loading prefab items... {round(count/jsonLength * 100)}%&#34;,
                &#34;stateProgress&#34;: count/jsonLength * 100,
                &#34;totalProgress&#34;: 75 + count/jsonLength * 5
            }
            mainUI.ui.update(data)
            mainUI.root.update()
    
    sys.stdout.write(f&#34;Loaded {len(prefabItems)} prefab items.\nNow matching prefab items...\n&#34;)
    count = 0
    
    
    # TODO: FIX THIS CODE
    # Original C# code in TsMapRenderer.cs -&gt; lines 393-417
    
    
    for prefabItem in prefabItems:
        prefabItem.Prefab = prefabs.GetPrefabByToken(prefabItem.Prefab)
        
        if prefabItem.Prefab == None:
            # print(f&#34;Prefab item {prefabItem.Uid} has no prefab!&#34;)
            pass 
        
        try:
            if not prefabItem.Prefab.ValidRoad:
                prefabItems.remove(prefabItem)
                continue
        except:
            prefabItems.remove(prefabItem)
            continue
        
        prefabItem.StartNode = nodes.GetNodeByUid(prefabItem.StartNodeUid)
        prefabItem.EndNode = nodes.GetNodeByUid(prefabItem.EndNodeUid)
        
        originNode = prefabItem.Nodes[0]
        mapPointOrigin = prefabItem.Prefab.PrefabNodes[prefabItem.Origin]
        
        # rot = originNode.Rotation - math.pi - math.atan2(mapPointOrigin.RotZ, mapPointOrigin.RotX) + math.pi / 2
        
        prefabStartX = originNode.X - mapPointOrigin.X
        prefabStartZ = originNode.Z - mapPointOrigin.Z
        
        prefabItem.X = prefabStartX
        prefabItem.Z = prefabStartZ
        
        # Rotate the prefab curves to match the road.
        # They are rotated around the origin node location by an amount of pi.
        prefabItem.NavigationLanes = []
        for curvePoints in prefabItem.CurvePoints:
            # def rotate_point(x, z, angle, rot_x, rot_z):
            #     s = math.sin(angle)
            #     c = math.cos(angle)
            #     new_x = x - rot_x
            #     new_z = z - rot_z
            #     return (new_x * c - new_z * s + rot_x, new_x * s + new_z * c + rot_z)
            # 
            # newPointStart = rotate_point(prefabStartX + curve.startX, prefabStartZ + curve.startZ, rot, originNode.X, originNode.Z)
            # newPointEnd = rotate_point(prefabStartX + curve.endX, prefabStartZ + curve.endZ, rot, originNode.X, originNode.Z)
            
            curveStartX = curvePoints[0]
            curveStartZ = curvePoints[1]
            curveEndX = curvePoints[2]
            curveEndZ = curvePoints[3]
            
            prefabItem.NavigationLanes.append((curveStartX, curveStartZ, curveEndX, curveEndZ))
            
        
        # Set the prefab item as a reference to the road
        for nav in prefabItem.Navigation:
            for item in nav.Item2:
                if item.Type == &#34;Road&#34;:
                    road = roads.GetRoadByUid(item.Uid)
                    if road != None:
                        road.ConnectedPrefabItems.append(prefabItem.Uid)
                        # print(f&#34;Added prefab item {prefabItem.Uid} to road {road.Uid}&#34;)
        
        
        
        count += 1
        if count % 500 == 0:
            data = {
                &#34;state&#34;: f&#34;Matching prefabs and prefab items... {round(count/len(prefabItems) * 100)}%&#34;,
                &#34;stateProgress&#34;: count/len(prefabItems) * 100,
                &#34;totalProgress&#34;: 80 + count/len(prefabItems) * 20
            }
            mainUI.ui.update(data)
            mainUI.root.update()
            sys.stdout.write(f&#34;Matched prefab items : {count}\r&#34;)
    
    sys.stdout.write(f&#34;Matched prefab items : {count}\nNow optimizing prefab items...\n&#34;)
    
    data = {
        &#34;state&#34;: f&#34;Optimizing array... {round(count/len(prefabItems) * 100)}%&#34;,
        &#34;stateProgress&#34;: 100,
        &#34;totalProgress&#34;: 100
    }
    mainUI.ui.update(data)
    mainUI.root.update()
    
    for item in prefabItems:
        if item.X &lt; itemsMinX:
            itemsMinX = item.X
        if item.X &gt; itemsMaxX:
            itemsMaxX = item.X
        if item.Z &lt; itemsMinZ:
            itemsMinZ = item.Z
        if item.Z &gt; itemsMaxZ:
            itemsMaxZ = item.Z
            
    itemsTotalWidth = itemsMaxX - itemsMinX
    itemsTotalHeight = itemsMaxZ - itemsMinZ
    
    itemsAreaCountX = math.ceil(itemsTotalWidth / 1000)
    itemsAreaCountZ = math.ceil(itemsTotalHeight / 1000)
    
    for item in prefabItems:
        x = math.floor((item.X - itemsMinX) / 1000)
        z = math.floor((item.Z - itemsMinZ) / 1000)
        
        if x not in optimizedPrefabItems:
            optimizedPrefabItems[x] = {}
        if z not in optimizedPrefabItems[x]:
            optimizedPrefabItems[x][z] = []
            
        optimizedPrefabItems[x][z].append(item)
    
    print(&#34;Prefab Items parsing done!&#34;)
    

def GetItemsInTileByCoordinates(x, z):
    x = math.floor((x - itemsMinX) / 1000)
    z = math.floor((z - itemsMinZ) / 1000)
    
    if x in optimizedPrefabItems:
        if z in optimizedPrefabItems[x]:
            prefabItems = optimizedPrefabItems[x][z].copy()
            return prefabItems
    
    return []

def GetLocalCoordinateInTile(x,y, tileX=-1, tileZ=-1):
    if tileX == -1:
        tileX = math.floor((x - itemsMinX) / 1000)
    if tileZ == -1:
        tileZ = math.floor((y - itemsMinZ) / 1000)
    
    localX = x - (tileX * 1000 + itemsMinX)
    localY = y - (tileZ * 1000 + itemsMinZ)
    
    return (localX, localY)

def GetTileCoordinates(x, y):
    x = math.floor((x - itemsMinX) / 1000)
    z = math.floor((y - itemsMinZ) / 1000)
    
    return (x, z)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetItemsInTileByCoordinates"><code class="name flex">
<span>def <span class="ident">GetItemsInTileByCoordinates</span></span>(<span>x, z)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def GetItemsInTileByCoordinates(x, z):
    x = math.floor((x - itemsMinX) / 1000)
    z = math.floor((z - itemsMinZ) / 1000)
    
    if x in optimizedPrefabItems:
        if z in optimizedPrefabItems[x]:
            prefabItems = optimizedPrefabItems[x][z].copy()
            return prefabItems
    
    return []</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetLocalCoordinateInTile"><code class="name flex">
<span>def <span class="ident">GetLocalCoordinateInTile</span></span>(<span>x, y, tileX=-1, tileZ=-1)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def GetLocalCoordinateInTile(x,y, tileX=-1, tileZ=-1):
    if tileX == -1:
        tileX = math.floor((x - itemsMinX) / 1000)
    if tileZ == -1:
        tileZ = math.floor((y - itemsMinZ) / 1000)
    
    localX = x - (tileX * 1000 + itemsMinX)
    localY = y - (tileZ * 1000 + itemsMinZ)
    
    return (localX, localY)</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetTileCoordinates"><code class="name flex">
<span>def <span class="ident">GetTileCoordinates</span></span>(<span>x, y)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def GetTileCoordinates(x, y):
    x = math.floor((x - itemsMinX) / 1000)
    z = math.floor((y - itemsMinZ) / 1000)
    
    return (x, z)</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.LoadPrefabItems"><code class="name flex">
<span>def <span class="ident">LoadPrefabItems</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def LoadPrefabItems():
    global prefabItems
    global optimizedPrefabItems
    global itemsMinX
    global itemsMaxX
    global itemsMinZ
    global itemsMaxZ
    global itemsTotalWidth
    global itemsTotalHeight
    global itemsAreaCountX
    global itemsAreaCountZ
    
    jsonData = json.load(open(prefabItemsFileName))
    jsonLength = len(jsonData)
    
    count = 0
    for item in jsonData:
        item = jsonData[item]
        
        itemObj = PrefabItem()
        itemObj.Uid = item[&#34;Uid&#34;]
        itemObj.StartNodeUid = item[&#34;StartNodeUid&#34;]
        itemObj.EndNodeUid = item[&#34;EndNodeUid&#34;]
        
        itemObj.Nodes = []
        for node in item[&#34;Nodes&#34;]:
            itemObj.Nodes.append(nodes.GetNodeByUid(node))
        
        itemObj.BlockSize = item[&#34;BlockSize&#34;]
        itemObj.Valid = item[&#34;Valid&#34;]
        itemObj.Type = item[&#34;Type&#34;]
        itemObj.X = item[&#34;X&#34;]
        itemObj.Z = item[&#34;Z&#34;]
        itemObj.Hidden = item[&#34;Hidden&#34;]
        itemObj.Flags = item[&#34;Flags&#34;]
        
        itemObj.Navigation = []
        for nav in item[&#34;Navigation&#34;]:
            navObj = Navigation()
            navId = nav
            nav = item[&#34;Navigation&#34;][nav]
            navObj.NavId = navId
            navObj.Item1 = nav[&#34;Item1&#34;]
            navObj.Item2 = []
            for item2 in nav[&#34;Item2&#34;]:
                item2Obj = NavigationItem2()
                item2Obj.Uid = item2[&#34;Uid&#34;]
                item2Obj.Type = item2[&#34;Type&#34;]
                navObj.Item2.append(item2Obj)
                
            itemObj.Navigation.append(navObj)
            navObj = None
            
        itemObj.Origin = item[&#34;Origin&#34;]
        itemObj.Padding = item[&#34;Padding&#34;]
        itemObj.Prefab = item[&#34;Prefab&#34;]
        itemObj.IsSecret = item[&#34;IsSecret&#34;]
        itemObj.CurvePoints = item[&#34;curvePoints&#34;]
        
        if itemObj.Valid:
            prefabItems.append(itemObj)
        
        count += 1
        
        if count % int(jsonLength/100) == 0:
            sys.stdout.write(f&#34;\rLoaded {count} prefab items.\r&#34;)
            data = {
                &#34;state&#34;: f&#34;Loading prefab items... {round(count/jsonLength * 100)}%&#34;,
                &#34;stateProgress&#34;: count/jsonLength * 100,
                &#34;totalProgress&#34;: 75 + count/jsonLength * 5
            }
            mainUI.ui.update(data)
            mainUI.root.update()
    
    sys.stdout.write(f&#34;Loaded {len(prefabItems)} prefab items.\nNow matching prefab items...\n&#34;)
    count = 0
    
    
    # TODO: FIX THIS CODE
    # Original C# code in TsMapRenderer.cs -&gt; lines 393-417
    
    
    for prefabItem in prefabItems:
        prefabItem.Prefab = prefabs.GetPrefabByToken(prefabItem.Prefab)
        
        if prefabItem.Prefab == None:
            # print(f&#34;Prefab item {prefabItem.Uid} has no prefab!&#34;)
            pass 
        
        try:
            if not prefabItem.Prefab.ValidRoad:
                prefabItems.remove(prefabItem)
                continue
        except:
            prefabItems.remove(prefabItem)
            continue
        
        prefabItem.StartNode = nodes.GetNodeByUid(prefabItem.StartNodeUid)
        prefabItem.EndNode = nodes.GetNodeByUid(prefabItem.EndNodeUid)
        
        originNode = prefabItem.Nodes[0]
        mapPointOrigin = prefabItem.Prefab.PrefabNodes[prefabItem.Origin]
        
        # rot = originNode.Rotation - math.pi - math.atan2(mapPointOrigin.RotZ, mapPointOrigin.RotX) + math.pi / 2
        
        prefabStartX = originNode.X - mapPointOrigin.X
        prefabStartZ = originNode.Z - mapPointOrigin.Z
        
        prefabItem.X = prefabStartX
        prefabItem.Z = prefabStartZ
        
        # Rotate the prefab curves to match the road.
        # They are rotated around the origin node location by an amount of pi.
        prefabItem.NavigationLanes = []
        for curvePoints in prefabItem.CurvePoints:
            # def rotate_point(x, z, angle, rot_x, rot_z):
            #     s = math.sin(angle)
            #     c = math.cos(angle)
            #     new_x = x - rot_x
            #     new_z = z - rot_z
            #     return (new_x * c - new_z * s + rot_x, new_x * s + new_z * c + rot_z)
            # 
            # newPointStart = rotate_point(prefabStartX + curve.startX, prefabStartZ + curve.startZ, rot, originNode.X, originNode.Z)
            # newPointEnd = rotate_point(prefabStartX + curve.endX, prefabStartZ + curve.endZ, rot, originNode.X, originNode.Z)
            
            curveStartX = curvePoints[0]
            curveStartZ = curvePoints[1]
            curveEndX = curvePoints[2]
            curveEndZ = curvePoints[3]
            
            prefabItem.NavigationLanes.append((curveStartX, curveStartZ, curveEndX, curveEndZ))
            
        
        # Set the prefab item as a reference to the road
        for nav in prefabItem.Navigation:
            for item in nav.Item2:
                if item.Type == &#34;Road&#34;:
                    road = roads.GetRoadByUid(item.Uid)
                    if road != None:
                        road.ConnectedPrefabItems.append(prefabItem.Uid)
                        # print(f&#34;Added prefab item {prefabItem.Uid} to road {road.Uid}&#34;)
        
        
        
        count += 1
        if count % 500 == 0:
            data = {
                &#34;state&#34;: f&#34;Matching prefabs and prefab items... {round(count/len(prefabItems) * 100)}%&#34;,
                &#34;stateProgress&#34;: count/len(prefabItems) * 100,
                &#34;totalProgress&#34;: 80 + count/len(prefabItems) * 20
            }
            mainUI.ui.update(data)
            mainUI.root.update()
            sys.stdout.write(f&#34;Matched prefab items : {count}\r&#34;)
    
    sys.stdout.write(f&#34;Matched prefab items : {count}\nNow optimizing prefab items...\n&#34;)
    
    data = {
        &#34;state&#34;: f&#34;Optimizing array... {round(count/len(prefabItems) * 100)}%&#34;,
        &#34;stateProgress&#34;: 100,
        &#34;totalProgress&#34;: 100
    }
    mainUI.ui.update(data)
    mainUI.root.update()
    
    for item in prefabItems:
        if item.X &lt; itemsMinX:
            itemsMinX = item.X
        if item.X &gt; itemsMaxX:
            itemsMaxX = item.X
        if item.Z &lt; itemsMinZ:
            itemsMinZ = item.Z
        if item.Z &gt; itemsMaxZ:
            itemsMaxZ = item.Z
            
    itemsTotalWidth = itemsMaxX - itemsMinX
    itemsTotalHeight = itemsMaxZ - itemsMinZ
    
    itemsAreaCountX = math.ceil(itemsTotalWidth / 1000)
    itemsAreaCountZ = math.ceil(itemsTotalHeight / 1000)
    
    for item in prefabItems:
        x = math.floor((item.X - itemsMinX) / 1000)
        z = math.floor((item.Z - itemsMinZ) / 1000)
        
        if x not in optimizedPrefabItems:
            optimizedPrefabItems[x] = {}
        if z not in optimizedPrefabItems[x]:
            optimizedPrefabItems[x][z] = []
            
        optimizedPrefabItems[x][z].append(item)
    
    print(&#34;Prefab Items parsing done!&#34;)</code></pre>
</details>
</dd>
</dl>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation"><code class="flex name class">
<span>class <span class="ident">Navigation</span></span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class Navigation:
    NavId = 0
    Item1 = 0
    Item2 = []</code></pre>
</details>
<h3>Class variables</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.Item1"><code class="name">var <span class="ident">Item1</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.Item2"><code class="name">var <span class="ident">Item2</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.NavId"><code class="name">var <span class="ident">NavId</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2"><code class="flex name class">
<span>class <span class="ident">NavigationItem2</span></span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class NavigationItem2:
    Uid = 0
    Type = &#34;&#34;</code></pre>
</details>
<h3>Class variables</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2.Type"><code class="name">var <span class="ident">Type</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2.Uid"><code class="name">var <span class="ident">Uid</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem"><code class="flex name class">
<span>class <span class="ident">PrefabItem</span></span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class PrefabItem:
    Uid = 0
    StartNodeUid = 0
    EndNodeUid = 0
    StartNode = None
    Nodes = []
    BlockSize = 0
    Valid = False
    Type = 0
    X = 0
    Z = 0
    Hidden = False
    Flags = 0
    Navigation = []
    Origin = 0
    Padding = 0
    Prefab = None
    NavigationLanes = []
    IsSecret = False
    CurvePoints = [[]]
    EndPoints = []</code></pre>
</details>
<h3>Class variables</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.BlockSize"><code class="name">var <span class="ident">BlockSize</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.CurvePoints"><code class="name">var <span class="ident">CurvePoints</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.EndNodeUid"><code class="name">var <span class="ident">EndNodeUid</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.EndPoints"><code class="name">var <span class="ident">EndPoints</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Flags"><code class="name">var <span class="ident">Flags</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Hidden"><code class="name">var <span class="ident">Hidden</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.IsSecret"><code class="name">var <span class="ident">IsSecret</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Navigation"><code class="name">var <span class="ident">Navigation</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.NavigationLanes"><code class="name">var <span class="ident">NavigationLanes</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Nodes"><code class="name">var <span class="ident">Nodes</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Origin"><code class="name">var <span class="ident">Origin</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Padding"><code class="name">var <span class="ident">Padding</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Prefab"><code class="name">var <span class="ident">Prefab</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.StartNode"><code class="name">var <span class="ident">StartNode</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.StartNodeUid"><code class="name">var <span class="ident">StartNodeUid</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Type"><code class="name">var <span class="ident">Type</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Uid"><code class="name">var <span class="ident">Uid</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Valid"><code class="name">var <span class="ident">Valid</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.X"><code class="name">var <span class="ident">X</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Z"><code class="name">var <span class="ident">Z</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData" href="index.html">Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetItemsInTileByCoordinates" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetItemsInTileByCoordinates">GetItemsInTileByCoordinates</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetLocalCoordinateInTile" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetLocalCoordinateInTile">GetLocalCoordinateInTile</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetTileCoordinates" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.GetTileCoordinates">GetTileCoordinates</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.LoadPrefabItems" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.LoadPrefabItems">LoadPrefabItems</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation">Navigation</a></code></h4>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.Item1" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.Item1">Item1</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.Item2" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.Item2">Item2</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.NavId" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.Navigation.NavId">NavId</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2">NavigationItem2</a></code></h4>
<ul class="">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2.Type" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2.Type">Type</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2.Uid" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.NavigationItem2.Uid">Uid</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem">PrefabItem</a></code></h4>
<ul class="two-column">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.BlockSize" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.BlockSize">BlockSize</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.CurvePoints" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.CurvePoints">CurvePoints</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.EndNodeUid" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.EndNodeUid">EndNodeUid</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.EndPoints" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.EndPoints">EndPoints</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Flags" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Flags">Flags</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Hidden" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Hidden">Hidden</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.IsSecret" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.IsSecret">IsSecret</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Navigation" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Navigation">Navigation</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.NavigationLanes" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.NavigationLanes">NavigationLanes</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Nodes" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Nodes">Nodes</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Origin" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Origin">Origin</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Padding" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Padding">Padding</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Prefab" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Prefab">Prefab</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.StartNode" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.StartNode">StartNode</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.StartNodeUid" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.StartNodeUid">StartNodeUid</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Type" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Type">Type</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Uid" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Uid">Uid</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Valid" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Valid">Valid</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.X" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.X">X</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Z" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Map.GameData.prefabItems.PrefabItem.Z">Z</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>